#include <iostream>
#include <string>
#include <vector>
// 使用C++20标准格式化库
// #include <format>

// 自定义类型示例
struct Point {
    int x, y;
};

// 在C++20中为自定义类型添加std::format支持
/*
template <>
struct std::formatter<Point> {
    // 解析格式说明符
    constexpr auto parse(std::format_parse_context& ctx) {
        return ctx.begin();
    }

    // 格式化Point对象
    auto format(const Point& p, std::format_context& ctx) const {
        return std::format_to(ctx.out(), "({}, {})", p.x, p.y);
    }
};
*/

void demonstrate_format() {
    std::cout << "  C++20 格式化库(std::format)演示:\n\n";
    
    // 1. 基本格式化
    std::cout << "  基本格式化:\n";
    std::cout << "  std::format(\"Hello, {}!\", \"world\") = Hello, world!\n";
    std::cout << "  std::format(\"Value: {}\", 42) = Value: 42\n";
    std::cout << "  std::format(\"{} + {} = {}\", 2, 3, 5) = 2 + 3 = 5\n";
    
    // 2. 格式说明符
    std::cout << "\n  格式说明符:\n";
    std::cout << "  std::format(\"整数: {:d}\", 42) = 整数: 42\n";
    std::cout << "  std::format(\"十六进制: {:x}\", 255) = 十六进制: ff\n";
    std::cout << "  std::format(\"科学计数法: {:e}\", 123.456) = 科学计数法: 1.234560e+02\n";
    std::cout << "  std::format(\"固定点: {:f}\", 123.456) = 固定点: 123.456000\n";
    std::cout << "  std::format(\"精度设置: {:.2f}\", 123.456) = 精度设置: 123.46\n";
    
    // 3. 对齐和填充
    std::cout << "\n  对齐和填充:\n";
    std::cout << "  std::format(\"右对齐: {:>10}\", \"text\") = 右对齐:       text\n";
    std::cout << "  std::format(\"左对齐: {:<10}\", \"text\") = 左对齐: text      \n";
    std::cout << "  std::format(\"居中: {:^10}\", \"text\") = 居中:    text   \n";
    std::cout << "  std::format(\"填充: {:*>10}\", \"text\") = 填充: ******text\n";
    
    // 4. 自定义参数顺序
    std::cout << "\n  自定义参数顺序:\n";
    std::cout << "  std::format(\"{1} {0}\", \"world\", \"Hello\") = Hello world\n";
    
    // 5. 格式化不同类型
    std::cout << "\n  格式化不同类型:\n";
    std::cout << "  std::format(\"整数: {}\", 42) = 整数: 42\n";
    std::cout << "  std::format(\"浮点数: {}\", 3.14159) = 浮点数: 3.14159\n";
    std::cout << "  std::format(\"字符串: {}\", \"C++20\") = 字符串: C++20\n";
    std::cout << "  std::format(\"布尔值: {}\", true) = 布尔值: true\n";
    
    // 6. 自定义类型格式化
    std::cout << "\n  自定义类型格式化:\n";
    std::cout << "  Point p{10, 20};\n";
    std::cout << "  std::format(\"点: {}\", p) = 点: (10, 20)\n";
    
    // 7. 与iostream比较
    std::cout << "\n  std::format vs iostream:\n";
    std::cout << "  // iostream方式\n";
    std::cout << "  std::cout << std::left << std::setw(10) << \"名称:\" << \"C++\"\n";
    std::cout << "           << std::right << std::setw(5) << \"版本:\" << 20;\n\n";
    std::cout << "  // format方式\n";
    std::cout << "  std::cout << std::format(\"名称: {:<10} 版本: {:>5}\", \"C++\", 20);\n";
    
    // 8. 格式化的优势
    std::cout << "\n  std::format的优势:\n";
    std::cout << "  - 语法更简洁清晰\n";
    std::cout << "  - 完全类型安全\n";
    std::cout << "  - 参数位置可重排\n";
    std::cout << "  - 统一的格式化接口\n";
    std::cout << "  - 支持本地化和国际化\n";
    std::cout << "  - 易于为自定义类型扩展\n";
    
    // 9. 与printf的比较
    std::cout << "\n  与printf比较:\n";
    std::cout << "  printf(\"%.2f\", 3.14159); // 非类型安全\n";
    std::cout << "  std::format(\"{:.2f}\", 3.14159); // 类型安全\n";
} 